home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / tools / utils / vfnt_210 / aesfont.c next >
C/C++ Source or Header  |  1995-11-25  |  6KB  |  205 lines

  1. /* Beispielprogramm zur Ermittlung der AES-Zeichensätze (IBM und SMALL)
  2.     (c) 1993-94 Harald Sommerfeldt */
  3.  
  4. /*
  5.     16.12.93: erste Version für das VdiFont 2.00-Paket
  6.      3. 2.94: um appl_find("?AGI")-Abfrage erweitert
  7.     25. 2.94: neue Routine: appl_xgetinfo() nach einem
  8.               Implementationsvorschlag von Martin Osieka @ WI
  9.     26. 2.94: um ein paar Kommentare erweitert
  10. */
  11.  
  12. #include <aes.h>
  13. #include <vdi.h>
  14. #include <tos.h>        /* bzw. osbind.h */
  15. #include <stdio.h>
  16.  
  17. #ifndef FALSE
  18. #define FALSE 0
  19. #define TRUE  1
  20. #endif
  21.  
  22. /* Wert eines Cookies holen, zurückgegeben wird TRUE bei Erfolg */
  23. typedef struct {
  24.     long    cookie, value;
  25. } cookiejar;
  26.  
  27. int    get_cookie( long cookie, long *value )
  28. {
  29.     cookiejar *_p_cookies;
  30.     void    *sp;
  31.  
  32.     sp = (void *)Super( NULL );
  33.     _p_cookies = *(void **)0x5A0;        /* Zeiger auf Cookiejar holen */
  34.     Super( sp );
  35.     if ( _p_cookies != NULL )            /* wenn Cookiejar installiert ... */
  36.     {                                            /* ... dann Cookies abklappern ... */
  37.         for (; _p_cookies->cookie != 0L; _p_cookies++ )
  38.         {
  39.             if ( _p_cookies->cookie == cookie )
  40.             {                                    /* ... bis der gewünschte Eintrag ist */
  41.                 if ( value != NULL ) *value = _p_cookies->value;
  42.                 return TRUE;
  43.             }
  44.         }
  45.     }
  46.     return FALSE;
  47. }
  48.  
  49.  
  50. /* appl_getinfo() für Pure-C */
  51. #ifdef __PUREC__
  52. AESPB aespb = { _GemParBlk.contrl, _GemParBlk.global, _GemParBlk.intin,
  53.                 _GemParBlk.intout, (int *)_GemParBlk.addrin, (int *)_GemParBlk.addrout };
  54.  
  55. int    appl_getinfo( int type, int *out1, int *out2, int *out3, int *out4 )
  56. {
  57.     _GemParBlk.intin[0] = type;
  58.     _GemParBlk.contrl[0] = 130;
  59.     _GemParBlk.contrl[1] = 1;
  60.     _GemParBlk.contrl[2] = 5;
  61.     _GemParBlk.contrl[3] = 0;
  62.     _crystal( &aespb );
  63.     *out1 = _GemParBlk.intout[1];
  64.     *out2 = _GemParBlk.intout[2];
  65.     *out3 = _GemParBlk.intout[3];
  66.     *out4 = _GemParBlk.intout[4];
  67.     return _GemParBlk.intout[0];
  68. }
  69.  
  70. #define ap_version    _GemParBlk.global[0]    /* AES-Versionsnummer (z.B. 0x140 = 1.40) */
  71. #endif
  72.  
  73.  
  74. /*
  75.     appl_xgetinfo()
  76.  
  77.     Parameter: wie bei appl_getinfo()
  78.     Ergebnis : != 0 wenn appl_getinfo() verfügbar und erfolgreich
  79. */
  80. int    appl_xgetinfo( int type, int *out1, int *out2, int *out3, int *out4 )
  81. {
  82.     static int has_agi = -1;
  83.     long    l;
  84.  
  85.     if ( has_agi < 0 )
  86.     {
  87.         has_agi = ( ap_version >= 0x400            /* MTOS? */
  88.                     || (get_cookie( 'MagX', &l ) && ((short **)l)[2][24] >= 0x200) /* Mag!X 2.0? */
  89.                     || appl_find( "?AGI" ) == 0 ); /* "?AGI"? */
  90.     }
  91.  
  92.     if ( has_agi ) return appl_getinfo( type, out1, out2, out3, out4 );
  93.     return 0;
  94. }
  95.  
  96.  
  97. int    vdi_handle;        /* unser VDI-Workstation-Handle */
  98. int    fonts_loaded;    /* TRUE wenn vst_load_fonts() aufgerufen wurde */
  99.  
  100. /*
  101.     appl_getfontinfo()
  102.  
  103.    Ermittelt die Kenndaten der AES-Zeichensätze (IBM und SMALL),
  104.    nach Möglichkeit (Mag!X 2.0, MTOS oder "?AGI") wird hierbei auf
  105.    die AES-Funktion appl_getinfo() zurückgegriffen
  106.  
  107.     Parameter:
  108.      ap_gtype: 0 für den IBM-Font, 1 für den SMALL-Font
  109.      height  : die ermittelte Größe in Pixeln (Basislinie<->Oberkante)
  110.      id      : die ermittelte Font-ID
  111.      type    : 1 wenn Speedo-Zeichensatz
  112.  
  113.    Der so ermittelte Zeichensatz kann mit
  114.      vst_font( vdi_handle, id );
  115.      vst_height( vdi_handle, height, &dummy, &dummy, &dummy, &dummy );
  116.    eingestellt werden.
  117. */
  118. void    appl_getfontinfo( int ap_gtype, int *height, int *id, int *type )
  119. {
  120.     int    attrib[10], dummy;
  121.  
  122.     /* ist appl_getinfo() vorhanden und erfolgreich? */
  123.     if ( appl_xgetinfo( ap_gtype, height, id, type, &dummy ) )
  124.     {
  125.         /* dann haben wir schon alles was wir wissen wollen! */
  126.  
  127.         /* Patzer von den ersten Mag!X 2.0-Versionen umgehen,
  128.            näheres entnehme man MAGXPTCH.TXT */
  129.         if ( *id == -12124 ) *id = 1;
  130.  
  131.         /* falls Zeichensatz (noch) nicht ansprechbar: GDOS-Zeichensätze laden */
  132.         if ( vst_font( vdi_handle, *id ) != *id && !fonts_loaded && vq_gdos() )
  133.         {
  134.             vst_load_fonts( vdi_handle, 0 );
  135.             fonts_loaded = TRUE;
  136.         }
  137.     }
  138.     else
  139.     {
  140.         /* ansonsten aktuell eingestellte AES-Zeichensatz-ID bestimmen */
  141.         vqt_attributes( graf_handle( &dummy, &dummy, &dummy, &dummy ), attrib );
  142.         *id = attrib[0];
  143.  
  144.         /* und wieder ggf. GDOS-Zeichensätze laden */
  145.         if ( vst_font( vdi_handle, *id ) != *id && !fonts_loaded && vq_gdos() )
  146.         {
  147.             vst_load_fonts( vdi_handle, 0 );
  148.             fonts_loaded = TRUE;
  149.         }
  150.  
  151.         /* für SMALL-Font nehmen wir nun einfach die kleinste mögliche,
  152.            für IBM-Font die akt. eingestellte Höhe */
  153.         if ( ap_gtype == 1 )        /* SMALL-Daten erwünscht? */
  154.         {
  155.             vst_font( vdi_handle, *id );
  156.             vst_point( vdi_handle, 1, &dummy, &dummy, &dummy, &dummy );
  157.             vqt_attributes( vdi_handle, attrib );
  158.         }
  159.         *height = attrib[7];
  160.         *type   = 0;
  161.     }
  162. }
  163.  
  164.  
  165. /*
  166.     Hauptprogramm
  167.  
  168.     Ermittelt die Kenndaten der AES-Zeichensätze mittels
  169.     appl_getfontinfo() und zeigt sie in Alert-Boxen an
  170. */
  171.  
  172. int    work_in[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2 };
  173. int    work_out[57];
  174. char    buffer[256];
  175.  
  176. int    main( void )
  177. {
  178.     int    height, id, speedo, dummy;
  179.  
  180.     appl_init();
  181.     vdi_handle = graf_handle( &dummy, &dummy, &dummy, &dummy );
  182.     if ( !appl_xgetinfo( 2, &work_in[0], &dummy, &dummy, &dummy ) )
  183.         work_in[0] = 2 + Getrez();
  184.     v_opnvwk( work_in, &vdi_handle, work_out );
  185.  
  186.     appl_getfontinfo( 0, &height, &id, &speedo );
  187.     sprintf( buffer, "[1][IBM-Zeichensatz|ID    : %d|Größe : %d|Speedo: %d][  OK  ]",
  188.              id, height, speedo );
  189.     wind_update( BEG_UPDATE );
  190.     form_alert( 1, buffer );
  191.     wind_update( END_UPDATE );
  192.  
  193.     appl_getfontinfo( 1, &height, &id, &speedo );
  194.     sprintf( buffer, "[1][SMALL-Zeichensatz|ID    : %d|Größe : %d|Speedo: %d][  OK  ]",
  195.              id, height, speedo );
  196.     wind_update( BEG_UPDATE );
  197.     form_alert( 1, buffer );
  198.     wind_update( END_UPDATE );
  199.  
  200.     if ( fonts_loaded ) vst_unload_fonts( vdi_handle, 0 );
  201.     v_clsvwk( vdi_handle );
  202.     appl_exit();
  203.     return 0;
  204. }
  205.